#include "usart.h"


//串口重定向
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
int _sys_exit(int x) 
{ 
	x = x; 
} 

//重定义fputc函数   printf 是一个宏
int fputc(int ch, FILE *f)
{ 	
	USART_SendData(USART2,ch);
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);      
	return ch;
}



void USART1_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	//串口是挂载在 APB2 下面的外设，所以使能函数为
	//使能 USART1 时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//使用的是串口 1，串口 1 对应着芯片引脚 PA9,PA10 需要使能PA的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 

	//GPIOA9 与 GPIOA10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
	//配置IO口复用功能
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	//速度 50MHz
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	//推挽复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
	//上拉
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
	//初始化 PA9，PA10
	GPIO_Init(GPIOA,&GPIO_InitStructure); 
	
	//PA9 复用为 USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 
	//PA10 复用为 USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	

	//一般设置为 9600;
	USART_InitStructure.USART_BaudRate = 115200;
	//字长为 8 位数据格式
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	//一个停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	//无奇偶校验位
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	//收发模式
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	//初始化串口
	USART_Init(USART1, &USART_InitStructure); 
	

//	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//	//抢占优先级 3
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//	//响应优先级 3
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;  
//	//IRQ 通道使能
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
//	//根据指定的参数初始化 VIC 寄存器
//	NVIC_Init(&NVIC_InitStructure);  

//	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收到数据产生中断

	//USART_ITConfig(USART1，USART_IT_TC，ENABLE);
	//使能串口
	USART_Cmd(USART1, ENABLE); 
	
//	while(USART_GetFlagStatus(USART1, USART_IT_TC));  //等待之前的数据发送玩再发送
//	USART_SendData(USART1, ch);
//	
//	while(!USART_GetFlagStatus(USART1, USART_IT_RXNE));  //有数据才去读
//	ch = USART_ReceiveData(USART1);

}

//PA2 PA3
void USART2_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	//串口是挂载在 APB2 下面的外设，所以使能函数为
	//使能 USART2 时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	//使用的是串口 2，串口 2 对应着芯片引脚 PA2,PA13 需要使能PA的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 

	//GPIOA2 与 GPIOA3
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; 
	//配置IO口复用功能
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	//速度 50MHz
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	//推挽复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
	//上拉
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
	//初始化 PA2，PA3
	GPIO_Init(GPIOA,&GPIO_InitStructure); 
	
	//PA2 复用为 USART2
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); 
	//PA3 复用为 USART2
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
	

	//一般设置为 115200;
	USART_InitStructure.USART_BaudRate = 9600;//115200;
	//字长为 8 位数据格式
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	//一个停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	//无奇偶校验位
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	//收发模式
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	//初始化串口
	USART_Init(USART2, &USART_InitStructure); 
	

	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	//抢占优先级 1
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	//响应优先级 2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;  
	//IRQ 通道使能
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	//根据指定的参数初始化 VIC 寄存器
	NVIC_Init(&NVIC_InitStructure);  

	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收到数据产生中断

	//USART_ITConfig(USART2，USART_IT_TC，ENABLE);
	//使能串口
	USART_Cmd(USART2, ENABLE); 
	
//	while(USART_GetFlagStatus(USART1, USART_IT_TC));  //等待之前的数据发送玩再发送
//	USART_SendData(USART1, ch);
//	
//	while(!USART_GetFlagStatus(USART1, USART_IT_RXNE));  //有数据才去读
//	ch = USART_ReceiveData(USART1);

}

